<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="\试题** \参考**     1.服务限流的方式有哪些？ ・漏桶算法：请求先进入到漏桶里，漏桶以一定的速度响应，当请求流入速度过大会直接溢出（访问频率超过接口响应速率），然后被拒绝请求。 ・令牌桶算法：系统会按恒定1&#x2F;QPS时间间隔往桶里加入Token,如果桶已经满了就不再加了，新请求来临时，会各自拿走一个Token,如果没有Token就拒绝服务。 ・基于redis实现的限流：假设每分钟">
<meta property="og:type" content="article">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="https://goofyer.gitee.io/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/%E7%BB%83%E4%B9%A0%E9%A2%98/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="\试题** \参考**     1.服务限流的方式有哪些？ ・漏桶算法：请求先进入到漏桶里，漏桶以一定的速度响应，当请求流入速度过大会直接溢出（访问频率超过接口响应速率），然后被拒绝请求。 ・令牌桶算法：系统会按恒定1&#x2F;QPS时间间隔往桶里加入Token,如果桶已经满了就不再加了，新请求来临时，会各自拿走一个Token,如果没有Token就拒绝服务。 ・基于redis实现的限流：假设每分钟">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2022-02-21T12:35:00.522Z">
<meta property="article:modified_time" content="2022-02-21T12:35:23.064Z">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/notes-on-computer-expertise/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/notes-on-computer-expertise/favicon.png">
  
  
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">

  
  
<link rel="stylesheet" href="/notes-on-computer-expertise/css/style.css">

  
    
<link rel="stylesheet" href="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.css">

  
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/notes-on-computer-expertise/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/">Home</a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/notes-on-computer-expertise/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://goofyer.gitee.io/notes-on-computer-expertise"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-Spring开发/练习题" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/%E7%BB%83%E4%B9%A0%E9%A2%98/" class="article-date">
  <time class="dt-published" datetime="2022-02-21T12:35:00.522Z" itemprop="datePublished">2022-02-21</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <div class="table-container">
<table>
<thead>
<tr>
<th><strong><em>\</em>试题**</strong></th>
<th><strong><em>\</em>参考**</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>1.服务限流的方式有哪些？</td>
<td>・漏桶算法：请求先进入到漏桶里，漏桶以一定的速度响应，当请求流入速度过大会直接溢出（访问频率超过接口响应速率），然后被拒绝请求。 ・令牌桶算法：系统会按恒定1/QPS时间间隔往桶里加入Token,如果桶已经满了就不再加了，新请求来临时，会各自拿走一个Token,如果没有Token就拒绝服务。 ・基于redis实现的限流：假设每分钟访问次数不能超过10次，在Redis中创建一个键，过期60秒，对此服务接口的访问就把键值加1，在60秒内增加到10的时候，禁止访问服务接口。 ・计数器，滑动窗口（假设窗口为10s,则建立一个大小为10的数组，然后每次让当前秒数除10，落到哪个格子就累加，每一时刻数组的和就是窗口的数值） 令牌桶可以应对突发的大流量；漏斗算法用于请求恒定速率通过；</td>
</tr>
<tr>
<td>2.如果突发断电，正在处理的队列应该怎么办？</td>
<td>・正在处理的实现事务功能，下次自动回滚。 ・队列实现持久化储存，下次启动自动载入。 ・添加标志位，未处理0、处理中1、已处理2.每次启动的时候，把所有状态为1的，置为0。 ・关键性的应用就给电脑配个UPS。</td>
</tr>
<tr>
<td>3.RabbitMQ的消息丢失解决方案</td>
<td>・消息持久化：Exchange 设置持久化：durable:true; ・Queue设置持久化； ・Message持久化发送。 ・ACK确认机制：消息发送确认；消息接收确认。</td>
</tr>
<tr>
<td>4.kafka消息会不会丢失？请说明原因</td>
<td>Kafka消息发送分同步（sync）、异步（async）两种方式。默认使用同步方式，可通过属性进行配置； 网络异常：acks设置为0时，不和Kafka集群进行消息接受确认，当网络发生异常等情况时，存在消息丢失的可能； 客户端异常：异步发送时，消息并没有直接发送至Kafka集群，而是在Client端按一定规则缓存并批量发送。在这期间，如果客户端发生死机等情况，都会导致消息的丢失； 缓存区满了：异步发送时，Client端缓存的消息超出了缓存池的大小，也存在消息丢失的可能； leader副本异常：acks设置为1时，Leader副本接收成功，Kafka集群就返回成功确认消息，而Follower副本可能还在同步。这时Leader副本突然出现异常，新Leader副本（原Follower副本）未能和其保持一致，就出现消息丢失的情况；</td>
</tr>
<tr>
<td>5.MQ有可能发生重复消费，如何避免，如何做到幂等？</td>
<td>概述：可能因为各种原因，导致了生产端发送了多条一样的消息给消费端，但是，消费端也只能消费一条，不会多消费。 一、唯一ID + 指纹码机制：指纹码（就是时间戳 + 业务的一些规则，来保证id + 指纹码在同一时刻是唯一的，不会出现重复） 好处：实现简单； 坏处：高并发下有数据库写入的瓶颈； 二、跟进ID进行分库分表进行算法路由；利用Redis的原子性实现 存在的问题： 我们是否需要进行数据的持久化，若需要持久化，怎么保证数据库和Redis做到原子性？ 若不立即持久化，都存储到redis中，如何设置同步策略？</td>
</tr>
<tr>
<td>6.如果需要在MyBMWapp上设计秒杀活动，架构设计（含前端）需要考虑哪些?</td>
<td>1.对于大促时候的秒杀活动，一般运营会设置静态的活动页面，配置静态活动页面主要有两个目的一方面是为了便于在各个社交媒体分发，另一方面是因为秒杀活动页的流量是大促期间最大的，通过配成静态页面可以将页面发布在公有云上动态的横向拓展； 2.将秒杀活动的静态页面提前刷新到CDN节点，通过CDN节点的页面缓存来解决访问压力和公司网络宽带，CDN上缓存js,css和图片 3.将活动H5页面部署到公有云的web server上，使用公有云最大的好处就是能够根据活动的火爆程度动态扩容而且成本较低，同时将访问压力隔离在公司系统外部； 4.在提供真正商品秒杀业务功能的app server上，需要进行交易限流、熔断控制、防止因为秒杀交易影响到其他正常服务的提供，我们在限流和熔断方面使用了hystrix,在核心交易的controller层通过hystrix进行交易并发限流控制，当交易流量超过我们设定的最大值时，会对新交易进行熔断处理固定返回静态失败报文。 5.服务降级处理，除了上面讲到的限流和熔断控制，我们还设置了降级开关，对于首页、购物车、订单查询、大数据等功能都会进行一定程度的服务降级，例如我们会对首页原先动态生成的大数据页面布局降级为所有人看到的是一样的页面、购物车也会降级为不在一级页面的tabber上的购物车图标上显示商品数量、历史订单的查询也会提供时间周期较短的查询、大数据商品推荐也会提供一样的商品推荐，通过这样的降级处理能够很好的保证各个系统在大促期间能够正常的提供最基础的服务，保证用户能够正常下单完成付款。 6。防止超卖现象，下单过程中防止超卖一般是通过实时库存的扣减在缓存中进行，异步扣减数据库中的库存，保证缓存中和数据库中库存的一致性。 ・在这个方案中我们使用的分布式缓存是redis,使用了codis集群方案稳定性和高可用方面还是比较有保证的，因为redis是单线程写，所以也不用担心线程安全的问题，redis自身就能够保证数据的强一致性，在下单的事务中包含了实现扣减缓存中的库存和异步发送队列，由队列处理器再异步从队列中取出订单根据订单信息扣减库存系统数据库中的商品数量。</td>
</tr>
<tr>
<td>7.Redis缓存穿透，缓存雪崩和缓存击穿原因，以及解决方案</td>
<td>1.1缓存穿透 key对应的数据在数据源中根本不存在，缓存层和持久层都不会命中。每次针对此key的请求从缓存获取不到，请求都会再次到数据源，从而可能压垮数据源。 基本原因： 第一、自身业务代码或者数据出现问题（例如： set和get的key不一致）； 第二、一些恶意攻击、爬虫等造成大量空命中（爬取线上商城商品数据，超大循环递增商品的ID） 解决方案： 1.缓存空对象：是指在持久层没有命中的情况下，对key进行set（key,null） 2.布隆过滤器拦截：在访问缓存层和存储层之前，将存在的key用布隆过滤器提前保存起来，做第一层拦截，当收到一个对key请求时先用布隆过滤器验证key是否存在，如果存在再进入缓存层、存储层。可以使用bitmap做布隆过滤器。这种方法适用于数据命中不高、数据相对固定、实时性低的应用场景，代码维护较为复杂，但是缓存空间占用少。 1.2缓存雪崩 基本原因：缓存层由于某种原因不可用（宕机）或者大量缓存由于超时时间相同在同一时间段失效（大批key失效/热点数据失效），大量请求直接到达存储层，存储层压力过大导致系统雪崩。 解决方案： 可以把缓存层设计成高可用的，即使个别节点、个别机器、甚至是机房宕掉，依然可以提供服务。利用sentinel或cluster实现。采用多级缓存，本地进程作为一级缓存，redis作为二级缓存，不同级别的缓存设置的超时时间不同，即使某级缓存过期了，也有其他级别缓存兜底缓存的过期时间用随机值，尽量让不同的key的过期时间不同（例如：定时任务新建大批量key,设置的过期时间相同） 1.3缓存击穿 基本原因：在缓存失效的瞬间，有大量线程来重建缓存，造成后端负载加大，甚至可能让应用崩溃。 解决方案 1.分布式互斥锁：只允许一个线程重建缓存，其他线程等待重建缓存的线程执行完，重新从缓存获取数据即可。set(key,value,timeout) 2.时间永不过期：为每个value设置一个逻辑过期时间，当发现超过逻辑过期时间后，会使用单独的线程去更新缓存</td>
</tr>
<tr>
<td>8.Redis的使用要注意什么，讲讲持久化方式，内存设置，集群的应用和劣势，淘汰策略等。</td>
<td>持久化方式：RDB时间点快照AOF记录服务器执行的所有写操作命令，并在服务器启动时，通过重新执行这些命令来还原数据集。 内存设置 maxmemory used_memory 虚拟内存：vm-enabled yes Redis Cluster 优点：数据依照slot存储分布在多个节点，节点间数据共享，能够动态调整数据分布；可拓展性；无中心架构；高可用性；能够降低运维成本，有效提高系统的可用性和拓展性。 缺点：不保证数据的强一致性；资源隔离性较差；Slave在集群中充当“冷备”，不能缓解读压力；key批量操作限制；key事务操作支持有限；key不可以将一个很大的键值对象如hash、list等映射到不同的节点；不支持多数据库空间；复制结构只支持一层；避免产生hot-key，导致主库节点成为系统的短板；避免产生big-key,导致网卡撑爆、慢查询等；重试时间应该大于cluster-node-time时间；</td>
</tr>
<tr>
<td>9.当生产系统出现性能瓶颈，你会从哪些方面陆续开始排查定位问题？</td>
<td>DB层面，有可能是sql,索引，表过大，数据库压力。 缓存层面：有可能缓存命中率差，redis性能瓶颈，需要扩容 服务器压力：服务器处理瓶颈 java层面：代码写法 前端层面：cdn压力，页面压力</td>
</tr>
<tr>
<td>10.如何使用redis和zookeeper实现分布式锁？有什么区别优缺点，分别适用什么场景？</td>
<td>Redis的实现方式： 1 获取锁的时候，使用setnx加锁，并使用expire命令为锁添加一个超时时间，超过该时间则自动释放锁，锁的value值为一个随机生成的UUID，通过此在释放锁的时候进行判断。 2 获取锁的时候还设置一个获取的超时时间，若超过这个时间则放弃获取锁。 3 释放锁的时候，若是该锁，则执行delete进行释放锁。 Zookeeper实现方式 1 使用zk的临时节点和有序节点，每个线程获取锁就是在zk创建一个临时有序的节点。 2 创建节点成功后，获取目录下的所有临时节点，再判断当前线程创建的节点是否是所有节点的序号最小的节点。 3 如果当前线程创建的节点是所有节点序号最小的节点，则认为获取锁成功。 4 如果当前线程创建的节点不是所有节点序号最小的节点，则对节点序号的前一个结点添加一个事件监听。 5 如果锁释放了，会唤醒下一个序号的节点，然后重新执行第3步，判断是否自己的节点序号最小。 Redis分布式锁 ：Redis有很高的性能，Redis命令对此支持较好，实现起来比较方便；分布式锁，其实需要自己不断尝试去获取锁，比较消耗性能。 Zookeeper分布式锁 ：具备高可用，可重入，阻塞锁特性，可解决失效死锁问题；因为需要频繁的创建和删除节点，性能上不如Redis方式； 场景需要根据实际进行多重考：从理解的难易程度角度：redis &gt; Zookeeper; 从实现的复杂性角度：Zookeeper &gt; redis;从性能角度：redis &gt; Zookeeper;  从可靠性角度：Zookeeper &gt; redis；</td>
</tr>
<tr>
<td>11.zookeeper是如何保证事务的顺序一致性的？</td>
<td>zookeeper采用了全局递增的事务 ld 来标识，所有的proposal都在被提出的时候加上了zxid，zxid实际上是一个64位的数字，高32位的是epoch用来标识leader周期，如果有新的leader产生出来，epoch会自增，低32位用来递增计数。当新产生proposal的时候，会依据数据库的两阶段过程，首先会向其他的server发出事务执行请求，如果超过半数的机器都执行并且能够成功，那么就会开始执行。</td>
</tr>
<tr>
<td>12.kafka吞吐量高的原因</td>
<td>1. Broker NIO异步消息处理，实现了IO线程与业务线程分离； 2.磁盘顺序写； 3.零拷贝（跳过用户拷贝区的拷贝，建立一个磁盘空间和内存的直接映射，数据不在复制到用户态缓冲区）； 4.分区/分段（每次文件操作都是一个小文件的操作，非常轻便，同时也增加了并行处理能力）； 5.批量发送（可以指定缓存的消息达到某个量的时候就发出去，或者缓存了固定的时间后就发送出去，大大减少服务端的I/O次数）； 6.数据压缩</td>
</tr>
<tr>
<td>13.Redis高性能的原因</td>
<td>一. 工作在内存中，数据存取速度快 二. 数据本质上都是key-value，格式简单，意味着分析快 三. 对数据的操作是单线程的，不存在资源竞争问题，避免抢锁带来的性能消耗 四. 使用多路复用接收客户端数据，其实这使得redis可以使用单线程处理数据的原因 五. 使用resp协议，实现简单，分析快</td>
</tr>
<tr>
<td>14.1000个任务，分给10个人做，怎么分配？请写出Demo代码</td>
<td>import java.util.Random; import java.util.concurrent.*; public class Main {  public static void main(String[] args) throws Exception{   //创建1000个随机数组成的数组   long[] array = new long[1000];   long expectedSum = 0;   for(int i = 0;i&lt;=array.length;i++){     array[i]=random();     expectedSum+=array[i];   }   System.out.println(“Expected sum:”+expectedSum);   //fork/join   ForkJoinTask<long> task = new SumTask(array,0,array.length);   long startTime = System.currentTimeMillis();   Long result = ForkJoinPool.commonPool().invoke(task);   long endTime=System.currentTimeMillis();   System.out.println(“Fork/join sum:”+result+”in”+(endTime-startTime)+”ms.”);  }  static Random random = new Random(0);  static long random(){    return random.nextInt(1000);  } }</td>
</tr>
<tr>
<td>15卡券中心怎么防止用户恶意频繁刷取卡券</td>
<td>用户登录限制:在活动期间对账号的登录进行限制，保持唯一登录环境。 黑名单库全面：历史黑名单库可以精确识别垃圾账号，因此黑名单库需海量且能实时更新。 设备指纹识别：稳定可靠的设备指纹识别技术，精确识别各种虚拟机，群控机，模拟器等设备。 嫌疑IP侦测：准确识别代理IP，机房IP，基站IP，肉鸡P等。识别嫌疑IP操作的批量注册和恶意登录行为，是杜绝羊毛党的重中之重。 全链路关联分机:多个业务场景需全流程智能分析，比如从注册登录到参加抽奖活动过程中的行为分析是否像正常人。</td>
</tr>
<tr>
<td>16.SpringCloud和Dubbo有什么不一样</td>
<td>1.dubbo采用RPC的方式交互，SpringCloud采用Http.restful协议进行交互。 2.dubbo依赖zookeeper进行服务注册，SpringCloud自己拥有自己的服务注册中心。 3.dubbo需要强依赖，需要持有相同的类或者jar包，SpringCloud弱依赖，但需要通过接口文档进行约束。 4.C数据一致性，A服务可用性，P服务对网络分区故障的容错性，zookeeper保证的是CP，euraka保证的是AP。</td>
</tr>
<tr>
<td>17.数据库索引的原理，为什么要用B+树，为什么不用二叉树</td>
<td>索引(index)是帮助数据库高效获取数据的数据结构，其本质：索引是数据结构。索引是一种特殊类型的数据对象，是为检索而存在的。 1、B+树的磁盘读写代价更低：B+树的内部节点并没有指向关键字具体信息的指针，因此其内部节点相对B树更小，如果把所有同一内部节点的关键字存放在同一盘块，那么盘块所能容纳的关键字数量也越多，一次性读入内存的需要查找的关键字也就越多，相对IO读写次数就降低了。 2、B+树的查询效率更加稳定：由于非终结点并不是最终指问文件内容的结点，而只是叶于结点中关键字的索引，所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同，导致每一个数据的查询效率相当。 3、由于B+树的数据都存储在叶子结点中，分支结点均为素引，方便扫库，只需要扫一遍叶子结点即可，但是B树因为其分支结点同样存储着数据，我们要找到具体的数据，需要进行一次中序遍历按序来扫，所以B+树更加适合在区间查询的情况，所以通常B+树用于数据库索引</td>
</tr>
<tr>
<td>18.limit100000加载很慢的话，怎么解决?</td>
<td>1.子查询优化法:先找出第一条数据，然后大于等于这条数据的id就是要获取的数据  缺点:数据必须是连续的，可以说不能有where条件，where条件会筛选数据，导致数据失去连续性 2.倒排表优化法，倒排表法类似建立索引，用一张表来维护页数，热后通过高效的连接得到数据  缺点：只适合数据数固定的情况，数据不能删除，维护页表困难 3.反向查找优化法，当偏移超过一半记录数的时候，先用排序，这样偏移就反转了  缺点:order by优化比较麻烦，要增加索引，索引影响数据的修改效率，并且要知道总记录数 4.limit限制优化法，把limit偏移量限制低于某个数。。超过这个数等于没数据，我记得alibaba的dba说过他们是这样做的 5.只查索引法</td>
</tr>
<tr>
<td>19.MYSQL的主从延迟，怎么解决？</td>
<td>1)、架构方面 1.业务的持久化层的实现采用分库架构，mysql服务可平行扩展，分散主力。 2.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库 3.服务的基础架构在业务和mysq之间加入 memcache或者 redist的 cache层。降低mysq的读压力 4不同业务的mysq物理上放在不同机器,分散压力 5.使用比主库更好的硬件设备作为save总结,mysq压力小,延迟自然会变小。 2)、硬件方面 1采用好服务器，比如4u比2u性能明显好，2u比1u性能明显好。 2存储用Ssd或者盘阵或者san，提开随机写的性能。 3主从间保证处在同一个交换机下面,并且是万兆环境 总结,硬件强劲,延迟自然会变小。一句话,缩小延迟的解决方案就是花钱和花时间 3)、mysql主从同步加速 1、 sync_binlog在 slave端设置为0 2、-logs-slave- updates从服务器从主服务器接收到的更新不记入它的二进制日志 3、直接禁用slave的 binlog 4、 slave端,如果使用的存储引擎是 innodb, innodb_flush_log_at_trx_commit=2 4)、从文件系统本身属性角度优化 由于每当读文件时OS都会将读取操作发生的时间回写到磁盘上.对于读操作频繁的数据库文件来说这是没必要的,只会增加磁盘系统的负担影响I/O性 5)、同步参数调整针对不同业务调整参数,对数据安全性较高,比如 sync_binlog=1. innodb_flush_log_at_trx_commit=1之类的设置是需要的而slave则不需要这么高的数据安全,完全可以将 sync_binlog设置为0或者关闭 binlog, innodb_flushlog也可以设置为0来提高sql的执行效率</td>
</tr>
<tr>
<td>20. Elasticsearch索引数据多了怎么办呢,如何调优,部署</td>
<td>解答：索引数据的规划,应在前期做好规划,正所谓“设计先行,编码在后”,这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。 3.1动态索引层面 基于模板+时间+ rollover api滚动创建索引,举例:设计阶段定义: blog索引的模板格式为: blog_index_时间戳的形式,每天递增数据。这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线2的32次幂-1,索引存储达到了TB+甚至更大。一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑+及早避免。 3.2存储层面 冷热数据分离存储,热数据(比如最近3天或者一周的数据),其余为冷数据。对于冷数据不会再写入新数据,可以考虑定期 force_merge加 shrink压缩操作,节省存储空间和检索效率 3.3部署层面 一旦之前没有规划,这里就属于应急策略。结合ES自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点等规划合理,不需要重启集群也能完成动态新增的。</td>
</tr>
<tr>
<td>21.数据量大的情况下分页查询很慢,有什么优化方案?</td>
<td>1.使用子查询优化 这种方式先定位偏移位置的id.然后往后查询,这种方式适用于id递增的情况。 2.使用id限定优化 这种方式假设数据表的id是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and来查询,限制是只能使用于明确知道id的情况,不过一般建立表的时侯,都会添加基本的id字段,这为分页查询带来很多便利 3.使用临时表优化 对于使用id限定优化中的问题,需要id是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行in查询。</td>
</tr>
<tr>
<td>22.如何给高并发系统做限流</td>
<td>在开发高并发系统时有三把利器用来保护系统：缓存，降级和限流 一. 缓存，在大型高并发系统中，如果没有缓存数据库将分分钟被爆，系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度，提高并发访问量，也是保护数据库，保护系统的有效方式。 二. 服务降级:当服务器压力剧增的情况下，根据当前业务情况及流量对一些服务和页面有策略的降级，以此释放服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别，面临不同的异常等级执行不同的处理。根据服务方式：可以拒绝服务，可以延迟服务，也有时候可以随机服务。 三. 限流：它可以认为服务降级的一种，限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说，系统的吞吐量是可以被测算的，为了保证系统的稳定运行，一旦达到的需要限制的阈值，就需要限制流量并采取一些措施以完成限制流量的目的。 比如：延迟处理，拒绝处理，或者部分拒绝处理等等。</td>
</tr>
<tr>
<td>23. 分布式集群下如何做到唯一ID序列号</td>
<td>一. 数据库自增序列：最常见的一种方式，利用DB来生成全库唯一ID 二. UUID：也是常见的方式，可以用数据库或程序生成，全球唯一。 三. UUID变种，使用UUID to Int64的方法增加可读性；通过Nhibernate在其主键生成方式中提供了Comb算法，解决UUID无序问题。 四. 用Redis生成ID：因为Redis是单线程的，也可以用来生成全局唯一ID。可以用Redis的原子操作INCR和INCRBY来实现。 五. 用zookeeper生成唯一ID：主要通过其znode数据版本来生成序列号，可以生成32位和64位的数据版本号，客户端可以使用这个版本号作为唯一的序列号。 六. 利用MongoDB的ObjectId 七. snowflake算法：是Twitter开源的分布式ID生成算法，结果是一个long型的ID</td>
</tr>
<tr>
<td>24. 什么是SpringCloudBus，SpringCloudConfig</td>
<td>Spring cloud bus通过轻量消息代理连接各个分部的节点。这会用在广播状态的变化（例如配置变化）或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对Spring boot应用进行扩展，也可以用来建立一个多个应用之间的通信频道。 Spring Cloud Config是一个解决分布式系统的配置管理方案。它包含Client和Server两个部分，Server提供配置文件的存储，以接口的形式将配置文件的内容提供出去，Client通过接口获取数据，并依据此数据初始化自己的应用。</td>
</tr>
<tr>
<td>25. 画一画服务注册与发现的流程图</td>
<td>・各个维服务启动时，将自己的网络信息注册到服务发现组件中，服务发现组件存储这些信息。 ・消费者从服务发现组件查询服务提供者的网络信息，并调用接口。 ・微服务与服务发现组件之间通过心跳机制确认服务的存活状态。 ・服务地址变更会重新注册到服务发现组件中。</td>
</tr>
</tbody>
</table>
</div>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://goofyer.gitee.io/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/%E7%BB%83%E4%B9%A0%E9%A2%98/" data-id="cl403sxqw000vf8vudn3zgawr" data-title="" class="article-share-link">Share</a>
      
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/notes-on-computer-expertise/2022/02/23/python/python%E7%BC%96%E5%86%99%E5%B0%8F%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          (no title)
        
      </div>
    </a>
  
  
    <a href="/notes-on-computer-expertise/2022/02/21/Spring%E5%BC%80%E5%8F%91/tomcat/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title"></div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C#工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C++工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/Mysql/">Mysql</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/blender/">blender</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/manim/">manim</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/spring/">spring</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/">vba基础操作</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E5%88%9B%E9%80%A0%E6%A8%A1%E5%BC%8F/">创造模式</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">操作系统</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">操作系统基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/">操作系统开发</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">数据结构基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%A8%A1%E6%9D%BF/">模板</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/">深度学习</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%8B%B1%E8%AF%AD/">英语</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%99%9A%E5%B9%BB4/">虚幻4</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/">计算机组成原理</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/notes-on-computer-expertise/tags/C/" rel="tag">C++</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/notes-on-computer-expertise/tags/C/" style="font-size: 10px;">C++</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/05/">May 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/03/">March 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/02/">February 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/01/">January 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2021/12/">December 2021</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/31/vue/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6%E9%AA%8C%E8%AF%81%E7%A0%81%E6%97%A0%E6%B3%95%E6%98%BE%E7%A4%BA/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/26/%E6%95%B0%E6%8D%AE%E5%BA%93/navicat%E5%AE%89%E8%A3%85/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/25/%E8%99%9A%E5%B9%BB4%E5%BC%95%E6%93%8E%E5%BC%80%E5%8F%91/%E8%99%9A%E5%B9%BB%E5%9B%9B%20mod%E5%88%B6%E4%BD%9C/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/python/python%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E7%AC%94%E8%AE%B0/EXCEL%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/">(no title)</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2022 John Doe<br>
      Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/notes-on-computer-expertise/" class="mobile-nav-link">Home</a>
  
    <a href="/notes-on-computer-expertise/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/notes-on-computer-expertise/js/jquery-3.4.1.min.js"></script>



  
<script src="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.js"></script>




<script src="/notes-on-computer-expertise/js/script.js"></script>





  </div>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ["$","$"], ["\\(","\\)"] ],
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
            processEscapes: true
        }
    });
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax();
        for (var i = 0; i < all.length; ++i)
            all[i].SourceElement().parentNode.className += ' has-jax';
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>
</body>
</html>